package 二叉树

/*
https://leetcode.cn/problems/diameter-of-binary-tree/?envType=study-plan-v2&envId=top-100-liked

543. 二叉树的直径
给你一棵二叉树的根节点，返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。

示例 1：
输入：root = [1,2,3,4,5]
输出：3
解释：3 ，取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2：
输入：root = [1,2]
输出：1
*/
func diameterOfBinaryTree(root *TreeNode) int {
	if root == nil { //1.如果根节点为nil, 直接返回0即可
		return 0
	}

	maxLength := 0          //2.声明最大直径
	Depth(root, &maxLength) //3.调用最大直径方法

	return maxLength
}

// Depth  最大直径
func Depth(root *TreeNode, maxLength *int) int {
	if root == nil {
		return 0
	}

	l := Depth(root.Left, maxLength)  //根节点左侧的最大深度
	r := Depth(root.Right, maxLength) //根节点右侧的最大深度
	*maxLength = Max(l+r, *maxLength)

	return Max(l, r) + 1
}

func Max(x int, y int) int {
	if x > y {
		return x
	}

	return y
}
